#pragma
#include<pthread.h>
#include<iostream>
#include<semaphore>
#include<vector>
using namespace std;
const static int defaultcap=5;
template<class T>
class runqueue
{
private:
void P(sem_t &sem)
{
sem_wait(&sem);
}
void V(sem_t &sem)
{

sem_post(&sem);

}

 
public:
    runqueue(int cap=defaultcap)
    :runqueue_(cap)
    ,cap_(cap)
    ,cindex(0)
    ,pindex(0)
    {
       sem_init(&cdata_sem_,0,0);
       sem_init(&pspace_sem_,0,cap);



    }
    ~runqueue()
    {
    sem_destroy(&cdata_sem_);
    sem_destroy(&pspace_sem_);
    }
    void push(const T&in)
    {
     P(pspace_sem_);
     runqueue_[pindex]=in;
     pindex++;
     pindex%=cap_;
     V(cdata_sem_);



    }
    void pop(T*out)
    {
    P(cdata_sem_);
    *out=runqueue_[cindex];
    cindex++;
    cindex%=cap_;
    V(pspace_sem_);
    }
private:
  vector<T> runqueue_;
  int cap_;

  int cindex;
  int pindex;


  sem_t cdata_sem_;
  sem_t pspace_sem_;


   


};

